Tutorial 8: Visualização de Dados com ggplot I
Introdução: Visualização de Dados com ggplot.
Nas semanas anteriores, cobrimos três tarefas fundamentais em R. Começamos com uma introdução bÔsica ao R. Demos nosso segundo passo aprendendo a usar os pacotes do tidyverse. Neste ambiente, aprendemos a usar o dplyr para manipulação de dados, e conectar dados relacionais, e o tidyr para organizar nossos bancos de dados.
Este semana vamos um passo adiante em nossa aprendizado. Aprenderemos sobre como utilizar o R para visualizar seus dados. Para isto, utilizaremos a pacote ggplot, que tambƩm faz parte do tidyverse.
Este tutorial Ć© inspirado no excelente livro Data Visualization:A practical introduction de Kieran Healy.
Porque investir em boas visualizaƧƵes ?
Enquanto acadĆŖmicos, uma das habilidades mais importantes que vocĆŖ precisa adquirir Ć© a capacidade de comunicar de forma efetiva seus resultados, sejam esses simples dados exploratórios, atĆ© modelos estatĆsticos rebuscados. A meu ver, mma visualização efetiva e bem pensada Ć© sempre mais atraente do que uma tabela. O pĆŗblico em geral, incluindo nossos colegas acadĆŖmicos, nĆ£o saberĆ£o onde olhar e como analisar uma tabela cheia de nĆŗmeros, enquanto um bom grĆ”fico pode ser bastante intuitivo de seguir.
Nosso itinerƔrio.
Para aprendar sobre visualização de dados, vamos percorrer os seguintes passos.
Preparaçao de Dados: Porquê preciso dos meus dados Tidy?
Introdução ao ggplot: Geoms and Aesthetics
AcessĆ”rios dos grĆ”ficos: labels, escalas, tĆtulos, e outros.
Casos Aplicados: reproduzindo grÔficos de artigos acadêmicos.
Preparação dos Dados: Porquê preciso dos meus dados Tidy?
Ter seus dados em formato tidy é fundamental para o uso do ggplot. 80% do trabalho de visualização de dados estÔ em preparar seus dados, os outros 20% é pensar quais dados utilizar e como botar em código.
Nós aprendemos semana passsada, porém a guisa de revisão. As três propriedades mais importantes que definem um banco de dados tidy são:
Cada coluna Ʃ uma variƔvel.
Cada linha é uma observação.
Cada valor em uma linha.
Vamos ver estas regras visualmente:
E porque Ć© importante ter nossos dados em formato tidy quando pensamos em visualização? O ggplot funciona conectando colunas com visuais. E para fazer isto, precisamos de que cada coluna seja uma variĆ”vel ā exatament como dados tidy sĆ£o organizados.
Introducao ao ggplot.
Visualização de dados envolve conectar (mapear) variÔveis em seu banco de dados a representações grÔficas. O ggplot fornece uma linguagem unificada para este processo de variÔveis -> grÔfico. HÔ outras formas e outros pacotes de visualização em R. O ggplot é uma destas linguagens.
Grammar of Graphics.
O ggplot Ʃ baseado na Grammar of Graphics. A grammar of graphics Ʃ uma linguagem desenvolvida para criar e descrever de forma unificada visualizaƧƵes grƔficas. Esta linaguem funciona com duas regras fundamentais:
Os grĆ”ficos sĆ£o construĆdos em camadas.
Cada variÔvel precisa ser mapeada a uma representação grÔfica.
Segue abaixo uma visualização grÔfica da Grammar of Graphics.. Discutiremos ao longo destas aulas cada uma das camadas de funcionamento da Grammar of Graphics.
ggplot: intuição.
O ggplot implementa o framework do Grammar of Graphics em R. Como esperado, Cada grĆ”fico Ć© construĆdo camada por camada:
- ComeƧando com seus dados,
- Mapeamento Dados -> Visuais (aes),
- DecisƵes geomƩtricas (geoms) e,
- Embelezamento do grƔfico (scale, theme e labels).
E sua lógica fundamental funciona conectando variÔveis a representações grÔficas por meio de uma função chamada aesthethics mapping (aes).
O grÔfico abaixo de Kieran Healy resume bem a lógica:
ggplot: na prƔtica.
Quatro āgrandeā etapas definem nosso trabalho de visualização:
Etapa dos Dados: Define qual banco de dados vocĆŖ pretende visualizar
Etapa de Mapear: Define quais variÔveis -> representações grÔficas você pretende visualizar.
Etapa de Geom: Define como vocĆŖ pretende visualizar.
Etapa de Embelezamento: Labels, escalas, coordenados, temasā¦.
Exemplo BƔsico.
Vamos ver um exemplo bƔsico de como funciona o ggplot utilizando o banco de dados gapminder.
Em abstrato
Com Dados.
library(tidyverse)
library(gapminder)
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap)) + # Etapa de Mapear
geom_point() # Etapa do GeomGeoms: Como queremos visualizar nossos dados?
As geom_function controlam o tipo de grÔfico que pretendemos visualizar. Por exemplo, grÔficos de dispersão, barras, mapas, linhas, boxplots, densidade, cada tipo de grÔfico representa uma geom_function() diferente. Vamos ver diversos exemplos a seguir.
Tipos de GrƔfico: Uma variƔvel.
Todos estes grÔficos necessitam desomente uma variÔvel como input (no eixo x). Os valores do eixo y são calculados diretamente pelo ggplot, de acordo com o grÔfico do seu interesse. Vamos ver alguns exemplos.
geom_density
Vamos gerar um grƔfico simples de densidade. Vamos plotar a densidade dos valores de expectativa de vida usando os dados do gapminder.
ggplot(data=gapminder, # dados
mapping=aes(x=lifeExp)) + # mapear
geom_density() # forma geomƩtricaCustomizar o grƔfico usando as representaƧƵes grƔficas fill e alpha.
ggplot(data=gapminder, # dados
mapping=aes(x=lifeExp)) + # mapear
geom_density(alpha=.5, fill="tomato2") # forma geomƩtricageom_histogram
Semelhante à densidade, porém, com histograms, os valores do eixo x são agrupados em intervalos (bins), e os valores do y são a soma de casos nestes intervalos.
ggplot(data=gapminder, # dados
mapping=aes(x=lifeExp)) + # mapear
geom_histogram() # forma geomƩtricaMais algumas customizaƧƵes, utilizando as representaƧƵes grƔficas color e fill e ajudstando a largura dos intervalos em x.
ggplot(data=gapminder, # dados
mapping=aes(x=lifeExp)) + # mapear
geom_histogram(bins=50, color="black",
fill="lightgreen") # forma geomƩtricageom_bar (variƔvel discreta)
geom_bar funciona da mesma forma que geom_hist, porém a variÔvel x é categórica (discreta). Dessa forma, o y serÔ a soma de observações em cada grupo presente em x.
ggplot(data=gapminder, # dados
mapping=aes(x=continent)) + # mapear
geom_bar() Perceba, o eixo y Ʃ a soma de cada continente. Internamente, o ggplot usa o group_by() + summarize() para somar as observaƧƵes em cada grupo. Isto Ʃ diferente de plotar dados jƔ agrupados. Para isto, precisamos alterar o input de geom_bar. Por exemplo:
g_grouped <- gapminder %>%
count(continent)
ggplot(data=g_grouped, # dados
# adiciona o y
mapping=aes(x=continent, y=n)) + # mapear
# adiciona identity
geom_bar(stat="identity") Tipos de GrĆ”fico: ContĆnua x ContĆnua.
geom_point
Quando trabalhamos com duas variĆ”veis contĆnuas, o uso de grĆ”fico de dispersĆ£o (com pontos) Ć© em geral a escolha mais intuitiva. Como esperado, este tipo de grĆ”fico necessita de no mĆnimo duas variĆ”veis (xe y), e ambas precisam ser contĆnuas. Vejamos um exemplo.
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap)) + # Etapa de Mapear
geom_point() # Etapa do GeomVamos alterar outras representaƧƵes grƔficas: shape altera a formato dos pontos e size controla o tamanho dos pontos.
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap)) + # Etapa de Mapear
geom_point(shape=22, alpha=.5,
fill="tomato2",
color="black",
size=2) # Etapa do Geomgeom_smooth
O geom_smooth adiciona uma curva para descrever de forma intuitiva o padrão de associação dos seus dados.
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap)) + # Etapa de Mapear
geom_smooth(fill="steelblue",
color="black",
size=1, alpha=.3) # Etapa do GeomMĆŗltiplos geoms.
O gÅafico acima Ć© pouco intuitivo sem a inclusĆ£o dos pontos em si. Lembre-se que o ggplot funciona em camadas, portanto, podemos facilmente combinar mĆŗltiplas formas geomĆ©tricas em um Ćŗnico grĆ”fico. Somente precisamos incluir todos os dados e variĆ”veis nas nossas representaƧƵes grĆ”ficas.
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap)) + # Etapa de Mapear
# Pontos
geom_point(shape=22, alpha=.2,
fill="tomato2",
color="black",
size=2) + # Etapa do Geom
# TendĆŖncia
geom_smooth(fill="tomato2",
color="black",
size=1, alpha=.6) # Etapa do GeomTipos de GrĆ”fico: Discreta x ContĆnua.
geom_boxplot
O geom_boxplot combina variĆ”veis de tipo distintos. Utilizamos esta forma geomĆ©trica quando pretendemos apresentar um valor contĆnuo dividiso por outros valores categórico (grupos). O boxplot agrega esta variĆ”vel contĆnua e apresenta de forma intuitiva sua dispersĆ£o e medida central de cada grupo (mediana).
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=continent)) + # Etapa de Mapear
# Pontos
geom_boxplot(fill="tomato2",
color="black",
size=1.5,
alpha=.5) # Etapa do GeomRepresentaƧƵes GrƔficas (aes)
AtĆ© aqui, usamos basicamente duas representaƧƵes grĆ”ficas dentro das nossa função de mapear (aes): os eixos x e y. Intuitivamente, costumamos pensar nos eixos x e y como as Ćŗnicas variĆ”veis no banco de dados e consideramos outros elementos dos grĆ”ficos ā cores, transparĆŖncia, formato ā como acessórios.
Esta não é a forma como o ggplot funciona.
Todas as representaƧƵes grĆ”ficas ā color, fill, shape, alpha, linetype, etc⦠ā podem ser mapeadas a variĆ”veis do seu banco de dados. Este processo funciona adicionando mais elementos dentro da nossa função de mapear (aes).
Quais RepresentaƧƵes grĆ”ficas (aes) estĆ£o disponĆveis?
As principais representações grÔficas são as seis acima apresentadas.
Cada uma destas representações combinarÔ melhor com grÔficos distintos, e com objetivos distintos da sua anÔlise. Todas as variÔveis que você pretende visualizar do seu banco de dados precisar ser mapeada em seu objeto do ggplot. Este mapeamento se dÔ a partir da função aes(). As suas representações grÔficas não definem como você mostrarÔ seus dados, mas somente o que você pretende mostrar e usando qual representação grÔfica.
Vamos ver alguns exemplos de como mapear variƔveis -> representaƧƵes grƔficas.
Color: Para Colorir Dados Agrupados.
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap, # Etapa de Mapear
color=continent)) + # Com fill
geom_point() # Etapa do GeomFill: Para Preencher Dados Agrupados.
ggplot(data=gapminder, # dados
mapping=aes(x=lifeExp, fill=continent)) + # mapear
geom_density(alpha=.5) # forma geomƩtricagap_grouped <- gapminder %>%
group_by(year, continent) %>%
summarise(m=mean(lifeExp, na.rm = TRUE))
ggplot(data=gap_grouped, # dados
mapping=aes(x=year, y=m,
fill=continent)) + # mapear
geom_bar(stat="identity", position="dodge") Alpha e size: Para mostrar variação em valores.
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=gdpPercap)) + # Etapa mapear
geom_point(aes(alpha=pop,
size=log(pop))) + # addicionar representaƧƵes grƔficas
geom_smooth(color="red") + # Etapa do Geom
scale_x_log10()Shape
gap_grouped <- gapminder %>%
group_by(year, continent) %>%
summarise(m=mean(lifeExp, na.rm = TRUE))
ggplot(data=gap_grouped, ## Etapa dos Dados
aes(y=m, x=year,
shape=continent)) + # Etapa mapear
geom_point(size=3) +
geom_line()Desafio:
Descreva o grƔfico abaixo usando o que aprendemos do ggplot e grammar of graphics.
Quantas VariƔveis?
Quantas RepresentaƧƵes GrƔficas?
Quais Geoms?
Quais RepresentaƧƵes GrƔficas?